pub const TRUE_VAL: &'static str = "#t";
pub const FALSE_VAL: &'static str = "#f";
pub const VOID_VAL: &'static str = "#nil";

pub const ADD_OP: &'static str = "+";
pub const SUB_OP: &'static str = "-";
pub const MUL_OP: &'static str = "*";
pub const DIV_OP: &'static str = "/";
pub const REM_OP: &'static str = "%";
pub const LES_OP: &'static str = "<";
pub const GRT_OP: &'static str = ">";
pub const EQU_OP: &'static str = "=";
pub const NEQ_OP: &'static str = "!=";
pub const OR_OP: &'static str = "or";
pub const AND_OP: &'static str = "and";

pub const DEFINE: &'static str = "define";
pub const LAMBDA: &'static str = "lambda";
pub const BEGIN: &'static str = "begin";
pub const LET: &'static str = "let";
pub const IF: &'static str = "if";

pub const CONS: &'static str = "cons";
pub const LIST: &'static str = "list";
pub const RANGE: &'static str = "range";
pub const MAP: &'static str = "map";
pub const FILTER: &'static str = "filter";
pub const FOLDL: &'static str = "foldl";
pub const FOLDR: &'static str = "foldr";
pub const REDUCE: &'static str = "reduce";
pub const CAR: &'static str = "car";
pub const CDR: &'static str = "cdr";
pub const LENGTH: &'static str = "length";
pub const EMPTY: &'static str = "empty";


use lazy_static::lazy_static;
use std::collections::HashSet;

lazy_static! {
    pub static ref KEYWORD_SET: HashSet<&'static str> = [
        DEFINE, LAMBDA, CONS, LIST, RANGE, MAP, FILTER, FOLDL, FOLDR, CAR, CDR, LENGTH, EMPTY, REDUCE,
        BEGIN, LET, IF,
    ]
    .into();
    pub static ref OPERATOR_SET: HashSet<&'static str> =
        [ADD_OP, SUB_OP, MUL_OP, DIV_OP, REM_OP, LES_OP, GRT_OP, EQU_OP, NEQ_OP, OR_OP, AND_OP,]
            .into();
}
